home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_087 / wbdualpf / wbdualpf.c < prev   
C/C++ Source or Header  |  1992-05-06  |  8KB  |  346 lines

  1. /** wbdualpf.c :ts=8 **/
  2. /* Turn the workbench into dual playfield.
  3.  *
  4.  * You can use the same trick for your own screens,
  5.  * which is the recommended method for creating dual-playfield
  6.  * screens.
  7.  *
  8.  * -Start with a new, single-playfield screen
  9.  *  (don't set DUALPF in NewScreen.ViewModes)
  10.  * -Allocate a second playfield, set up a rastport for
  11.  *  rendering into it, and install it into your open screen
  12.  *  as shown here.  Intuition will never know about or use your
  13.  *  second playfield for its rendering (menus, gadgets, etc.).
  14.  * -Be sure to remove evidence of your deed before CloseScreen().
  15.  */
  16.  
  17. #include <exec/types.h>
  18. #include <exec/memory.h>
  19. #include <intuition/intuition.h>
  20.  
  21. #include <functions.h>
  22.  
  23. #ifdef ORIGINALCODE
  24. #define printf  kprintf
  25. #endif
  26.  
  27. struct  Remember    *rememberkey = NULL;
  28. struct  Window      *getNewWind();
  29.  
  30. struct  IntuitionBase   *IntuitionBase;
  31. struct  GfxBase         *GfxBase;
  32.  
  33. ULONG   flg = ACTIVATE | WINDOWCLOSE | NOCAREREFRESH | WINDOWDRAG
  34.         | WINDOWDEPTH | SIMPLE_REFRESH;
  35.  
  36. ULONG   iflg = CLOSEWINDOW | INTUITICKS ;
  37.  
  38. #define FANCYVERSION 1
  39. #if FANCYVERSION
  40. #define VISUALTICKS    30    /* intuiticks per frame    */
  41. #define CYCLETICKS    3    /* intuiticks per pen color    */
  42. #endif
  43.  
  44. main()
  45. {
  46.     struct  IntuiMessage    *msg;
  47.     struct Window   *window = NULL;
  48.     WORD    exitval = 0;
  49.  
  50.     /* hold data from *msg  */
  51.     ULONG   class;
  52.  
  53.     /* specific for this test    */
  54.     struct Screen *wbscreen;
  55.     struct RasInfo *rinfo2 = NULL;    /* second playfield rasinfo ... */
  56.     struct BitMap  *bmap2 = NULL;    /* ... and bitmap        */
  57.     struct RastPort *rport2 = NULL;    /* for rendering into bmap2    */
  58.     int       it_is_done = 0;        /* success flag            */
  59.     int       counter = 0;            /* for timing the visuals    */
  60.  
  61.     if (!(IntuitionBase = (struct IntuitionBase *)
  62.     OpenLibrary("intuition.library", 0L)))
  63.     {
  64.     printf("NO INTUITION LIBRARY\n");
  65.     exitval = 1;
  66.     goto EXITING;
  67.     }
  68.  
  69.     if (!(GfxBase = (struct GfxBase *)
  70.     OpenLibrary("graphics.library", 0L)))
  71.     {
  72.     printf("NO GRAPHICS LIBRARY\n");
  73.     exitval = 2;
  74.     goto EXITING;
  75.     }
  76.  
  77.     /* get a window on the workbench    */
  78.     window = getNewWind(320, 20, 300, 50, flg, iflg);
  79.     if (window == NULL)
  80.     {
  81.     printf("test: can't get window.\n");
  82.     exitval = 1;
  83.     goto EXITING;
  84.     }
  85.  
  86.  
  87.     /* ------ Add a second playfield for Workbench ------------ */
  88.  
  89.     wbscreen = window->WScreen;        /* find it    */
  90.  
  91.     /* allocate second playfield's rasinfo, bitmap, and bitplane    */
  92.  
  93.     if (!(rinfo2 = (struct RasInfo *)
  94.     AllocMem((LONG) sizeof(struct RasInfo), (LONG) MEMF_PUBLIC|MEMF_CLEAR)))
  95.     {
  96.     printf("alloc rasinfo failed\n");
  97.     goto EXITING;
  98.     }
  99.  
  100.     if (!(bmap2 = (struct BitMap *)
  101.     AllocMem((LONG) sizeof(struct BitMap), (LONG) MEMF_PUBLIC|MEMF_CLEAR)))
  102.     {
  103.     printf("alloc bitmap failed\n");
  104.     goto EXITING;
  105.     }
  106.  
  107.     InitBitMap(bmap2, 1L, (LONG) wbscreen->Width, (LONG) wbscreen->Height);
  108.  
  109.     /* we'll use 1 plane. */
  110.     if (!(bmap2->Planes[0] =
  111.     (UBYTE *) AllocRaster((LONG) wbscreen->Width, (LONG) wbscreen->Height)))
  112.     {
  113.     printf("alloc raster failed\n");
  114.     goto EXITING;
  115.     }
  116.  
  117.     /* get a rastport, and set it up for rendering into bmap2    */
  118.     if (!(rport2 = (struct RastPort *)
  119.     AllocMem((LONG) sizeof (struct RastPort), (LONG) MEMF_PUBLIC)))
  120.     {
  121.     printf("alloc rastport failed\n");
  122.     goto EXITING;
  123.     }
  124.     InitRastPort(rport2);
  125.     rport2->BitMap = bmap2;
  126.  
  127.     SetRast(rport2, 0L);
  128.  
  129.     /* manhandle viewport: install second playfield and change modes    */
  130.     Forbid();
  131.  
  132.     rinfo2->BitMap = bmap2;    /* install my bitmap in my rasinfo    */
  133.  
  134.     wbscreen->ViewPort.RasInfo->Next = rinfo2;
  135.         /* install rinfo for viewport's second playfield    */
  136.  
  137.     wbscreen->ViewPort.Modes |= DUALPF;
  138.                 /* convert viewport            */
  139.     it_is_done = 1;
  140.  
  141.     Permit();
  142.  
  143.     /* set my foreground color */
  144.     SetRGB4(&wbscreen->ViewPort, 9L, 0L, (LONG) 0xF, 0L);
  145.     /* color 9 is color 1 for second playfield of hi-res viewport */
  146.  
  147.     /* put viewport changed into effect    */
  148.     MakeScreen(wbscreen);
  149.     RethinkDisplay();
  150.  
  151.     drawSomething(rport2);
  152.  
  153.     FOREVER
  154.     {
  155.     if ((msg = (struct IntuiMessage *)GetMsg(window->UserPort)) == NULL)
  156.     {
  157.         Wait((ULONG) 1<<window->UserPort->mp_SigBit);
  158.         continue;
  159.     }
  160.  
  161.     class   = msg->Class;
  162.     ReplyMsg(msg);
  163.  
  164.     switch (class)
  165.     {
  166.     case INTUITICKS:
  167. #if FANCYVERSION
  168.         setPrimary(&wbscreen->ViewPort);    /* cycles colors */
  169.         if (counter++ > VISUALTICKS)
  170.         {
  171.         counter = 0;
  172.         SetRast(rport2, 0L);
  173.         drawSomething(rport2);
  174.         }
  175. #endif
  176.         break;
  177.  
  178.     case CLOSEWINDOW:
  179.         goto EXITING;
  180.     default:
  181.         printf("unknown event: class %lx\n", class);
  182.     }
  183.     }
  184.  
  185. EXITING:
  186.     /* clean up dual-playfield trick    */
  187.     if (it_is_done)
  188.     {
  189.     Forbid();
  190.     wbscreen->ViewPort.RasInfo->Next = NULL;
  191.     wbscreen->ViewPort.Modes &= ~DUALPF;
  192.     Permit();
  193.     MakeScreen(wbscreen);
  194.     RethinkDisplay();
  195.     }
  196.  
  197.     if (rport2) FreeMem(rport2, (LONG) sizeof (struct RastPort));
  198.     if (bmap2) 
  199.     {
  200.     if (bmap2->Planes[0])
  201.     {
  202.         FreeRaster(bmap2->Planes[0],
  203.             (LONG) wbscreen->Width, (LONG) wbscreen->Height);
  204.     }
  205.     FreeMem(bmap2, (LONG) sizeof (struct BitMap));
  206.     }
  207.     if (rinfo2) FreeMem(rinfo2, (LONG) sizeof (struct RasInfo));
  208.  
  209.     if (window) CloseWindow(window);
  210.     if (GfxBase) CloseLibrary(GfxBase);
  211.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  212.  
  213.     exit (exitval);
  214. }
  215.  
  216. #if FANCYVERSION
  217. /* cycle pen 1's color */
  218. setPrimary(vp)
  219. struct ViewPort *vp;
  220. {
  221.     static int current = 0;
  222.  
  223.     /* pen 1 is color 9 for second playfield in hires */
  224.     /* feel free too do this elegantly */
  225.  
  226.     if (!(current++ % CYCLETICKS)) return;
  227.  
  228.     switch ((current/CYCLETICKS)%3)
  229.     {
  230.     case 0:
  231.     SetRGB4(vp, 9L, 0xFL, 0L, 0L);
  232.     break;
  233.     case 1:
  234.     SetRGB4(vp, 9L, 0L, 0xFL, 0L);
  235.     break;
  236.     case 2:
  237.     SetRGB4(vp, 9L, 0L, 0L, 0xFL);
  238.     break;
  239.     }
  240. }
  241.  
  242. struct pt_st {
  243.     ULONG x;
  244.     ULONG y;
  245.     };
  246.  
  247. typedef struct pt_st Pt;
  248.  
  249. drawSomething(rp)
  250. struct RastPort *rp;
  251. {
  252.     int width, height;
  253.     LONG   RangeRand();
  254.     int i;
  255.  
  256.     Pt start, vertex, end;    /* random reference lines */
  257.     Pt p0, p1;        /* endpoints to be drawn    */
  258.  
  259.     width = rp->BitMap->BytesPerRow * 8;
  260.     height = rp->BitMap->Rows;
  261.  
  262.     /* set up two random reference lines */
  263.     start.x = RangeRand((LONG) width);
  264.     vertex.x   = RangeRand((LONG) width);
  265.     end.x   = RangeRand((LONG) width);
  266.  
  267.     start.y = RangeRand((LONG) height);
  268.     vertex.y = RangeRand((LONG) height);
  269.     end.y   = RangeRand((LONG) height);
  270.  
  271.     SetAPen(rp, 1L);
  272.  
  273.     /* draw lines connecting intermediate points */
  274.     for (i = 0; i <= 0x100; i += 0x10)
  275.     {
  276.     /* point between start and vertex */
  277.     p0.x = (start.x * (0xFF - i) + vertex.x  * i) >> 8;
  278.     p0.y = (start.y * (0xFF - i)  + vertex.y * i) >> 8;
  279.  
  280.     /* point between vertex and end    */
  281.     p1.x = (vertex.x * (0xFF - i) + end.x * i) >> 8;
  282.     p1.y = (vertex.y * (0xFF - i) + end.y * i) >> 8;
  283.  
  284.     Move(rp, p0.x, p0.y);
  285.     Draw(rp, p1.x, p1.y);
  286.     }
  287.  
  288. }
  289.  
  290. #else
  291.  
  292. drawSomething(rp)
  293. struct RastPort *rp;
  294. {
  295.     int width, height;
  296.     int r, c;
  297.  
  298.     width = rp->BitMap->BytesPerRow * 8;
  299.     height = rp->BitMap->Rows;
  300.  
  301.     SetAPen(rp, 1L);
  302.  
  303.     for (r = 0; r < height; r += 40)
  304.     for (c = 0; c < width; c += 40)
  305.     {
  306.         Move(rp, 0L, (LONG) r);
  307.         Draw(rp, (LONG) c, 0L);
  308.     }
  309. }
  310.  
  311. #endif
  312.  
  313. struct  Window * getNewWind(left, top, width, height, flg, iflg)
  314. SHORT   left, top, width, height;
  315. ULONG   flg, iflg;
  316. {
  317.     struct  Window  *OpenWindow();
  318.     struct  NewWindow   nw;
  319.  
  320.     nw.LeftEdge =   (SHORT) left;
  321.     nw.TopEdge  =   (SHORT) top;
  322.     nw.Width    =   (SHORT) width;
  323.     nw.Height   =   (SHORT) height;
  324.     nw.DetailPen    =   (UBYTE) -1;
  325.     nw.BlockPen =   (UBYTE) -1;
  326.     nw.IDCMPFlags   =   (ULONG) iflg;
  327.  
  328.     nw.Flags    =   (ULONG) flg;
  329.  
  330.     nw.FirstGadget  =   (struct Gadget *)   NULL;
  331.     nw.CheckMark    =   (struct Image *)    NULL;
  332.     nw.Title    =   (UBYTE *)   " Dual Playfield Mole ";
  333.     nw.Screen   =   (struct Screen *)   NULL;
  334.     nw.BitMap   =   (struct BitMap *)   NULL;
  335.     nw.MinWidth =   (SHORT) 50;
  336.     nw.MinHeight=   (SHORT) 30;
  337.     /* work around bug  */
  338.     nw.MaxWidth =   (SHORT) nw.Width;
  339.     nw.MaxHeight    =   (SHORT) nw.Height;
  340.     nw.Type     =   (USHORT) WBENCHSCREEN;
  341.  
  342.     return ((struct Window *) OpenWindow(&nw));
  343. }
  344.  
  345.  
  346.